package com.chapter21;

public class Singleton {
    private static Singleton instance;

    private Singleton(){

    }
    //双重锁定：相比于同步方法优势在于不用每个线程进来都加锁，而是只有在对象未被创建的时候在加锁。当对象创建
    //了后，其他线程进来判断对象不为空，就直接返回，不用加锁后在判断对象是否为空，提高了并发性
    public static Singleton getInstance(){
        if(instance == null){
            //这里必须要加第二重锁。两个线程同时进入这里，只有一个能获得锁，这个线程创建了对象后释放锁
            //这时候如果不加判断，另一个线程还是会进来创建一个对象
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}
